package com.example.springbootsecurity.demo.authentication;

import org.springframework.security.crypto.argon2.Argon2PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;

public class PasswordStorage {
    public static void main(String[] args) {
        bCrypt();
//        argon2();
//        pbkdf2();
//        sCrypt();
    }

    /**
     * 使用BCrypt算法对密码进行编码和验证的示例方法。
     * <p>
     * 该方法演示了如何使用BCryptPasswordEncoder来编码密码并验证编码后的密码是否匹配。
     * BCrypt是一种安全的密码哈希算法，适用于存储密码。
     * <p>
     * 参数说明:
     * 无参数
     * <p>
     * 返回值说明:
     * 无返回值
     */
    public static void bCrypt() {
        // 创建一个BCryptPasswordEncoder实例，强度为16
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
        // 对密码"myPassword"进行编码
        String result = encoder.encode("myPassword");
        // 打印编码后的结果
        System.out.println("BCrypt: "+result);
        // 验证密码是否匹配
        boolean matches = encoder.matches("myPassword", result);
        // 打印验证结果
        System.out.println("BCrypt Match: "+matches);
    }

    /**
     * 使用Argon2算法对密码进行编码和验证的示例方法。
     * 该方法演示了如何生成Argon2密码编码器，对密码进行编码，
     * 并验证编码后的密码是否与原始密码匹配。
     *
     * @return 无
     */
    public static void argon2(){
        // 初始化Argon2密码编码器
        Argon2PasswordEncoder encoder = Argon2PasswordEncoder.defaultsForSpringSecurity_v5_8();
        // 对密码进行编码
        String result = encoder.encode("myPassword");
        // 输出编码后的密码
        System.out.println("Argon2: "+result);
        // 验证编码后的密码是否匹配
        boolean matches = encoder.matches("myPassword", result);
        // 输出验证结果
        System.out.println("Argon2 Match: "+matches);
    }

    /**
     * 使用Pbkdf2算法对密码进行编码和验证。
     * 该方法创建一个Pbkdf2PasswordEncoder实例，用于编码给定的密码，并验证编码后的密码是否匹配。
     * 
     * @return 无
     */
    public static void pbkdf2(){
        Pbkdf2PasswordEncoder encoder = Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8();
        String result = encoder.encode("myPassword");
        System.out.println("Pbkdf2: "+result);
        boolean matches = encoder.matches("myPassword", result);
        System.out.println("Pbkdf2 Match: "+matches);
    }

    /**
     * sCrypt加密示例方法
     * 使用Spring Security默认配置创建SCryptPasswordEncoder实例
     * 演示密码加密和验证过程
     */
    public static void sCrypt(){
        // 创建SCryptPasswordEncoder实例，使用Spring Security v5.8默认配置
        SCryptPasswordEncoder encoder = SCryptPasswordEncoder.defaultsForSpringSecurity_v5_8();
        
        // 对原始密码进行加密处理
        String result = encoder.encode("myPassword");
        System.out.println("SCrypt: "+result);
        
        // 验证加密后的密码是否匹配
        boolean matches = encoder.matches("myPassword", result);
        System.out.println("SCrypt Match: "+matches);
    }
}